/**
 * fs.ReadStream:  读文件操作的类
 * fs.WriteStream: 写文件操作的类
 * fs.Stats : 文件信息的类
 * fs.FSWatcher : 文件监控的类
 */
// 都拥有 同步模式 和 异步模式
const fs = require('fs')
// Node约定： 在回调函数中，默认第一个参数是错误信息

/** 任何方法都有同步和异步模式   同步模式：方法名加上Sync
 * 一般的 像文件操作 处理IO流 默认使用同步模式 代码更加直观
 */


// 打开文件                        读：r   读写：r+
// open('文件路径','文件的操作权限，读/写/执行',(错误信息，当前文件的标识)=>{})    如果打开相同文件  则标识会自增
fs.open('4.流stream.js','r',(err,fd)=>{
    if(err){
        console.log('文件没有找到')
    }else{
        console.log('当前文件的标识为：'+fd)
        fs.close(fd,()=>{})   // 关闭文件
    }
})

/** 
 * 写入数据到文件 
 * fs.writeFile(文件名，写入的数据，可选配置，回调函数)    异步模式
 * fs.writeFileSync(文件名，写入的数据，可选配置)         同步模式 （需要try catch进行异常捕获 否则错误会直接导致报错）
 * 如果文件不存在，则会自动创建文件； 如果文件存在，则会替换文件内容。
 * 如果文件所在目录不存在 则会提示错误信息 不会自动创建目录与文件
 */
// fs.writeFile('./1.txt', '哈喽', err => {
//     if (err) throw err
//     console.log('文件写入成功')
// })
// or
/*
    try{
        fs.writeFileSync('F:/aa/1.txt', '哈喽')
        console.log('文件写入成功')
    }catch(err){
        throw err
    }
*/


// 追加文件内容  appendFileSync()
// fs.appendFileSync('./1.txt','追加的内容')


// 读取文件内容 readFileSync()
// let res = fs.readFileSync('./1.txt')
// console.log(res.toString())


// 更改文件名称 renameSync()
// fs.renameSync('./1.txt','./rename.txt')


// 删除文件 unlinkSync()
// fs.unlinkSync('./rename.txt')




/**
 * 目录操作
 *      创建目录 mkdirSync()
 *      删除目录 rmdirSync()
 * 创建目录不能递归创建 ： 不支持 mkdir('/a/b/c') 
 * 删除目录： 不能删除非空文件的目录
 */

//  fs.mkdirSync('./a')
//  fs.rmdirSync('./a')



// 封装一个删除目录的方法  可直接删除非空文件的目录
// rmdir('./app')
function rmdir(dirname){
    let filePath = fs.readdirSync(dirname)  // 读取目录 [ '1.txt', '2.txt', 'a' ]
    filePath.forEach(child=>{
        if(fs.statSync(dirname+'/'+child).isDirectory()){ //  如果当前目录下的内容还是目录则在次进行回调
            rmdir(dirname+'/'+child)
        }else{
            // 删除文件
            fs.unlinkSync(dirname+'/'+child)
        }
    })
    // 删除目录
    fs.rmdirSync(dirname)
}
